package com.itheima.reggie.controller;

import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
import com.baomidou.mybatisplus.core.conditions.update.LambdaUpdateWrapper;
import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
import com.itheima.reggie.common.R;
import com.itheima.reggie.dto.DishDto;
import com.itheima.reggie.entity.Category;
import com.itheima.reggie.entity.Dish;
import com.itheima.reggie.servrce.CategoryService;
import com.itheima.reggie.servrce.DishService;
import lombok.extern.slf4j.Slf4j;
import org.apache.commons.lang.StringUtils;
import org.springframework.beans.BeanUtils;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.*;

import java.util.ArrayList;
import java.util.List;

@Slf4j
@RestController
@RequestMapping("/dish")
public class DishController {
    @Autowired
    private DishService dishService;
    @Autowired
    private CategoryService categoryService;
    @PostMapping
    public R<String> save(@RequestBody DishDto dishDto){
        dishService.saveDishAndFlavor(dishDto);
        return  R.success("菜品及菜品口味信息保存成功");
    }
    /**
     * 基础分页查询 带条件
     */
    @GetMapping("/page")
    public R<Page>page(int page,int pageSize,String name){
        // 根据 name条件 模糊查询 并且完成 分页展示
        //1构建 分页构造器
        Page<Dish> pageinfo = new Page<Dish>(page, pageSize);
        //2.构建 条件构造器
        LambdaQueryWrapper<Dish> wrapper = new LambdaQueryWrapper<>();
        wrapper.like(StringUtils.isNotEmpty(name),Dish::getName,name);
//            隐形条件  有序排列字段    安装排序字段   正序
//        没有排序字段   按照更新时间排序  逆序
        wrapper.orderByAsc(Dish::getUpdateTime);
        //4.执行方法
        dishService.page(pageinfo,wrapper);
        //pageInfo getTotal()总记录数
        //         getRecords()---List<Dish>当前页面dish信息
        //问题在于我们反回的PageDIsh pageInfo
                //List<Dish> records
                //     Dish Dish里面没有categoryName
        //Dis里面能够返回categoryName？能够有这个属性？
        //Dish 里面没有这个属性? 没有 dish表和Dish类对应
        //你的儿子有 DishDto有 DishDto是Dish跟前端交互的补充
        //因为这个属性 categoryName 是跟前端交互的属性 不是数据库的属性
        //能否返回给页面Page<Dish>了？
        //得返回page<DishDto>
        Page<DishDto>dishDtoPage=new Page<>();
        //pageInfo里面有数据库查询到的分页数据
        //pageInfo的属性赋值给dishDtoPage
        //BeanUtils.copyProperties(pageInfo,dishDtoPage);反射 泛型擦除了
        // 直接这么写 dishDtoPage里面的列表 相当于变成List<Dish>
        BeanUtils.copyProperties(pageinfo,dishDtoPage,"records");
        List<DishDto>records=new ArrayList<>();
        List<Dish> dishList = pageinfo.getRecords();
        for (Dish dish:dishList){
            DishDto dishDto = new DishDto();
            BeanUtils.copyProperties(dish,dishDto);
            System.out.println(dishDto);
            Long categoryId = dish.getCategoryId();
            Category category = categoryService.getById(categoryId);
            dishDto.setCategoryName(category.getName());
            records.add(dishDto);
        }
        dishDtoPage.setRecords(records);
        return R.success(dishDtoPage);

    }

    /**
     *  根据id 查询 dishDto数据
     */
    @GetMapping("/{id}")
    public R<DishDto>getById(@PathVariable Long id){
        DishDto dishDto = dishService.getByIdWithFlavor(id);
        return R.success(dishDto);
    }
    /**
     * 根据菜品id 更新菜品及口味最新数据
     *     逻辑
     *        根据菜品id更新 菜品数据
     *        根据菜品id 删除以前的口味数据
     *        根据菜品id 添加新的口味数据
     */
    @PutMapping
    public R<String>update(@RequestBody DishDto dishDto){
        log.info("查看更新后的数据"+dishDto);
        log.info("查看更新后的dishDto:{}"+dishDto);
        dishService.updateWithFlavor(dishDto);
        return  R.success("更新菜品和口味信息成功");
    }
    /**
     * 根据ids们  进行批量的启售和停售
     *      *            包含单个启售停售
     * @param sta  要修改的状态 在路径上 路径参数形式接收
     * @param ids  哪些id对应的菜品要 修改状态
     * @return
     */
    @PostMapping("/status/{sta}")
    public R<String>updateStatusbyIds(@PathVariable Integer sta,Long[]ids){
        for (Long id:ids){
            LambdaUpdateWrapper<Dish> updateWrapper = new LambdaUpdateWrapper<>();
            updateWrapper.set(Dish::getStatus,sta);
            updateWrapper.eq(Dish::getStatus,id);
            dishService.update(updateWrapper);

        }
        return R.success("更新批量状态完成");
    }
    //
//    @GetMapping("/list")
//    public R<List<Dish>> list(Long categoryId){
//
//    }
    /**
     * 根据分类id 查询该分类下指定的 菜品信息
     *    dish类型可以接收
     *       categoryId   因为有categoryId属性
     *       可以接收我dish其他属性作为条件
     *       提高方法的复用性-----高内聚 我一个人顶多个人
     */
    @GetMapping("/list")
    public R<List<Dish>>list(Dish dish){
        log.info("根据id查菜品"+dish.getCategoryId());
        LambdaQueryWrapper<Dish> wrapper = new LambdaQueryWrapper<>();
//        wrapper.eq(dish.getCategoryId()!=null, Dish::getCategoryId,dish.getCategoryId());
        wrapper.eq(dish.getCategoryId()!=null,Dish::getCategoryId,dish.getCategoryId());
        wrapper.eq(Dish::getStatus,1);
        List<Dish> list = dishService.list();
        return R.success(list);
    }

}

